
public class Test {
    public static void main(String[] args) throws Exception {
        WeekDay d1 = WeekDay.of("Monday");
        WeekDay d2 = WeekDay.of("Monday");
        WeekDay d3 = WeekDay.of("Tuesday");

        System.out.println(d1 == d2); // true → 同一实例
        System.out.println(d1 == d3); // false → 不同实例
        System.out.println("total pool size = " + 3); // 实际只 2 个对象
    }

}

// 享元（Flyweight）的核心思想很简单：
// 如果一个对象实例一经创建就不可变，那么反复创建相同的实例就没有必要，直接向调用方返回一个共享的实例就行，
// 这样即节省内存，又可以减少创建对象的过程，提高运行速度
final class WeekDay {
    private final String name;

    private WeekDay(String name) {
        this.name = name;
    } // 私有构造

    public String name() {
        return name;
    }

    // 工厂：第一次 new，后面直接给旧对象
    public static WeekDay of(String name) {
        return POOL.computeIfAbsent(name, WeekDay::new);
    }

    // 共享池
    private static final java.util.Map<String, WeekDay> POOL = new java.util.concurrent.ConcurrentHashMap<>();
}